home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Software Vault: The Gold Collection
/
Software Vault - The Gold Collection (American Databankers) (1993).ISO
/
cdr11
/
pdox693.zip
/
MAKERUN.SC
< prev
next >
Wrap
Text File
|
1993-06-07
|
71KB
|
1,157 lines
; ───────────────────────────────────────────────────────────────────────────────────────
; GENERIC UTILITY TO AUTOMATICALLY CREATE RUNTIME VERSIONS OF ANY PARADOX APPLICATION
; Copyright 1993 Virginia B. Sauer All Rights Reserved
; This program may be copied/modified without charge provided both that this
; copyright notice is included without change, and that any accompanying
; documentation includes the notice "Portions of code (c) Copyright 1993,
; Virginia B. Sauer"
; ───────────────────────────────────────────────────────────────────────────────────────
; Many developers cringe at the ominous words, "Let's give them a runtime version",
; usually uttered with the expectation that it will be ready in thirty minutes.
; This generic utility was therefore designed to automate the process for any Paradox
; application. It supports RDA, and automatically provides simple, user-friendly
; menu-driven installation routines.
; In addition to being able to provide instant gratification whenever a client or
; Management suddenly decides to produce a runtime version, this will enable one to
; incorporate menu options to automatically generate copies whenever desired.
; The only caveat is that runtime versions prior to 4.0 will not support wait queries.
; However, queries-by-form can easily be substituted (and are far more intuitive to most
; users). A freeware generic adhoc querying utility appeared in a previous issue of this
; publication.
; To convert interactive systems to runtime, it will also be necessary to change all
; instances of command Echo to TKEcho. (The latter is a formerly undocumented PAL
; command included with Paradox Runtime, and recently made public by Borland.)
; This can quickly and effortlessly be handled with virtually any word processor or text
; editor, including Paradox 4's script editor. Most such products will enable you to
; automatically change all occurrences within all of the script files at once.
; Since TKEcho will work in both runtime and interactive Paradox, most developers simply
; use TKEcho in all code to ensure that every application is "version independent" and
; will work in either runtime or interactive Paradox.
; ───────────────────────────────────────────────────────────────────────────────────────
; *************** I M P O R T A N T N O T E ***************
; ───────────────────────────────────────────────────────────────────────────────────────
; This utility requires a runtime version of Paradox that has been configured to match
; your coding constraints - e. g., whether or not your code is dependent upon setting
; blanks equal to zero, maintained indices, formfeeds rather than linefeeds, a specific
; sort, color preferences, et cetera.
; However, this customization need only be done once, and can then be automatically
; incorporated for each runtime application you provide.
; (1) Create a directory to hold your customized runtime version of Paradox (e. g., at
; the DOS prompt, type MD C:\Pdox40\Runtime to create a runtime directory named
; C:\Pdox40\Runtime).
; (2) Install your runtime version of Paradox in that newly-created directory. Unless
; you have other needs or preferences, delete all but the following files:
; VERSION 4.0: == or == VERSION 3.5:
; ─────────── ───────────
; Dpmi16bi.ovl Pdoxrun.aux
; Dpmiinst.exe Pdoxrun.exe
; Dpmiload.exe Pdoxrun.msg
; Pdoxrun.aux Pdoxrun.ntp
; Pdoxrun.exe Pdoxrun.ov1
; Pdoxrun.ico Pdoxrun.ov2
; Pdoxrun.msg Pdoxrun.som
; Pdoxrun.ov1 Pdoxrun.sor
; Pdoxrun.ov2 Pdoxrunk.exe
; Pdoxrun.pif Pdoxrunr.exe
; Pdoxrun.som Pdoxrunt.exe
; Pdoxrun.sor
; Pdoxrun.vid
; Yomdp.dll
; If your runtime version will include graphs, copy all graph files (those with
; extension .CHR) to the runtime directory.
; -- Create a "plain vanilla" version of your Paradox configuration file
; identical to yours except for options unique to your hardware,
; software, editor, and user name.
; (3) Copy your customized configuration to a temporary file (e. g., at the DOS prompt,
; type Copy C:\Pdox40\Paradox.cfg C:\Pdox40\Paradox.my if your Paradox files are in
; directory C:\Pdox40).
; Invoke Paradox's custom script. (If your Paradox directory is in your path and
; you have neither designated a working directory or established a default directory
; in the init script, simply Paradox Custom at the DOS prompt. Otherwise, select
; {Scripts} {Play} from the main menu, and type in Custom, replete with its full
; path - e. g., C:\\Pdox40\\Custom, if your main Paradox directory is named Pdox40.)
; When playing the custom script, make the following changes to create a "plain
; vanilla" version that will work on any user's machine:
; ■ Select {PAL} {Editor}.
; Press <Ctrl+BackSpace> to clear the space.
; Select {Return}.
; -- Change your private directory to subdirectory X of your main Paradox
; directory (which will automatically be created if it does not already
; exist). (Private directories are strongly recommended on standalone as well
; as multi-user systems, and establishing one will ensure that your code will
; work in both environments.)
; ■ Select {Set Private}.
; Type the full path of the directory containing your Paradox files, followed by
; \X ... e. g., C:\Pdox35\X or C:\Pdox40\X.
; Press the <Enter> key when finished.
; Select {Net} {UserName}
; Press <Ctrl+BackSpace> to clear the space.
; Press the <Enter> key.
; Select {Return}.
; ■ Select {Defaults} {Set Directory}.
; Press <Ctrl+BackSpace> to clear the space.
; Select {Return}.
; ■ If designing a 3.5 application to be run on older hardware unable to accomodate
; protected mode:
; Select {Tune} {Protected Mode} {Default Modes} {Real} {Return} {Return}.
; ■ If your default report settings are unusual (such as elite pitch, which is not
; available on all printers):
; Select {Reports} {Setup}.
; Move the asterisk to the printer most likely to be available to the majority of
; your users. (For any type of application, whether interactive or runtime, a
; printing routine, such as the freeware generic utility that appeared in a
; previous issue of "Instant Scripts", should also be included in your
; application.)
; ■ Press the <F2> key to execute the changes you have initiated.
; -- Copy the "plain vanilla" customized custom script to a temporary
; file where it will be available whenever needed.
; ■ At the DOS prompt, type Copy C:\Pdox40\Paradox.Cfg C:\Pdox40\Paradox.Std
; (substituting the name of the main directory containing your Paradox files if
; other than Pdox40).
; -- Copy your own customized custom script back to Paradox's
; configuration file.
; ■ At the DOS prompt, type Copy C:\Pdox40\Paradox.My C:\Pdox40\Paradox.Cfg
; (substituting the name of the main directory containing your Paradox files if
; other than Pdox40).
; -- Copy the "plain vanilla" customized custom script to the newly-
; created runtime directory
; (4) At the DOS prompt, type Copy C:\Pdox40\Paradox.Cfg C:\Pdox40\Runtime\Paradox.Cfg
; (substituting the name of the main directory containing your Paradox files if
; other than Pdox40).
; -- Copy your custom files to the newly-created runtime directory:
; (5) At the DOS prompt, type Copy C:\Pdox40\Custom.sc C:\Pdox40\Runtime\Custom.sc
; (substituting the name of the main directory containing your Paradox files if
; other than Pdox40).
; At the DOS prompt, type Copy C:\Pdox40\Custom.ov1 C:\Pdox40\Runtime\Custom.ov1
; (substituting the name of the main directory containing your Paradox files if
; other than Pdox40).
; -- Copy Readme.Com to the newly-created runtime directory:
; (6) At the DOS prompt, type Copy C:\Pdox40\Readme.Com C:\Pdox40\Runtime\Readme.Com
; (substituting the name of the main directory containing your Paradox files if
; other than Pdox40).
; -- This utility requires that PKWare's shareware PKZip is in your path. This
; can be downloaded from CompuServe or most BBSs, ordered from virtually any
; shareware vendor, or shared by a friend or colleague. (Obviously, it can
; easily be replaced by a different archiving utility should there be one
; which you prefer.)
; (7) At the DOS prompt, compress the newly customized runtime files by typing
; Pkzip C:\Pdox40\Runtime\*.*, substituting the name of the main directory
; containing your Paradox files if other than Pdox40.
; To conserve space, delete the original runtime files by typing the following
; lines at the DOS prompt, substituting the name of the main directory containing
; your Paradox files if other than Pdox40:
; Del C:\Pdox40\Runtime\PdoxRun.*
; Del C:\Pdox40\Runtime\Custom.*
; Del C:\Pdox40\Runtime\Paradox.*
; ───────────────────────────────────────────────────────────────────────────────────────
; THE ACTUAL UTILITY BEGINS HERE
; ───────────────────────────────────────────────────────────────────────────────────────
; ╔══════════════════════════════════════════════════════════════════════════════════════╗
; ║ PARAMETERS PASSED TO THIS PROCEDURE ║
; ╟─────────────┬────────────────────────────────────────────────────┬───────────────────╢
; ║ ARGUMENT │ DESCRIPTION │ SAMPLE ║
; ╟─────────────┼────────────────────────────────────────────────────┼───────────────────╢
; ║ │ │ ║
; ║ │ 1 - 8 character name/abbreviation of your │ ║
; ║ │ application (e. g., "Testing", to signify a │ "Budget" ║
; ║ SystemName │ system named Testing) │ ║
; ║ │ │ (To signify a ║
; ║ │ N. B. Unless this is a variable, it must be │ budget system) ║
; ║ │ enclosed in quotes. │ ║
; ║ │ │ ║
; ╟─────────────┼────────────────────────────────────────────────────┼───────────────────╢
; ║ │ │ ║
; ║ │ │ "PTS" ║
; ║ │ 1 - 8 character name/abbreviation for your user │ ║
; ║ │ to type to invoke your application from DOS. │ (for a Project ║
; ║ Acronym │ │ Tracking System ║
; ║ │ N. B. Unless this is a variable, it must be │ invoked by typ- ║
; ║ │ enclosed in quotes. │ ing PTS at the ║
; ║ │ │ DOS prompt) ║
; ║ │ │ ║
; ╟─────────────┼────────────────────────────────────────────────────┼───────────────────╢
; ║ │ │ ║
; ║ │ Password (if applicable) in order to copy │ ║
; ║ │ protected tables and scripts to the diskette. │ ║
; ║ │ │ ║
; ║ │ (If this is invoked from your main script - │ ║
; ║ │ and that it protected - the password will │ "AGORA" ║ ║
; ║ UserPass │ remain hidden.) │ ║ ║
; ║ │ │ (To signify ║
; ║ │ N. B. Remember that passwords are case │ password AGORA) ║
; ║ │ sensitive. │ ║
; ║ │ │ ║
; ║ │ Unless this is a variable, it must be │ ║
; ║ │ enclosed in quotes. │ ║
; ║ │ │ ║
; ╟─────────────┼────────────────────────────────────────────────────┼───────────────────╢
; ║ │ │ ║
; ║ │ The name of the main (or "driver") Paradox │ ║
; ║ │ script that will invoke the system on you user's │ "Budget" ║
; ║ Driver │ user's PC. │ ║
; ║ │ │ (To signify a ║
; ║ │ N. B. Unless this is a variable, it must be │ main script ║
; ║ │ enclosed in quotes. │ named Budget) ║
; ║ │ │ ║
; ╟─────────────┼────────────────────────────────────────────────────┼───────────────────╢
; ║ │ │ ║
; ║ │ The files (other than tables) to be included on │ ║
; ║ │ the runtime diskette │ ║
; ║ │ │ ║
; ║ │ Enter "ALL" if the entire system (including all │ "ALL" ║
; ║ │ subdirectories) is to be included in the runtime │ ║
; ║ │ version. │ (to copy all ║
; ║ │ │ files in the ║
; ║ │ If the runtime version is to include only a │ specified ║
; ║ │ subset of the data and/or files, cite each │ directory) ║
; ║ │ individual file name, encased in curly brackets │ ║
; ║ │ ({}) with NO space between the brackets. │ ║
; ║ │ │ ║
; ║ WhichFiles │ For example, you might design a major system │ ║
; ║ │ wherein each employee updates his information │ "{Manager.Sc} ║
; ║ │ and transfers it back and forth via diskette. │ {Budget.Sc} ║
; ║ │ Obviously, providing him with all of the │ {Guide.Doc}" ║
; ║ │ company's data would both prove unwieldy and │ ║
; ║ │ jeopardize security. Likewise, many major │ (if only these ║
; ║ │ systems have numerous components. One │ three files are ║
; ║ │ subdirectory may encompass project management, │ to be included) ║
; ║ │ another budgets, etc. Each department need (and │ ║
; ║ │ should) only receive the files relating to them. │ ║
; ║ │ │ ║
; ║ │ N. B. This must be enclosed in quotes. │ ║
; ║ │ │ ║
; ╟─────────────┼────────────────────────────────────────────────────┼───────────────────╢
; ║ │ │ ║
; ║ │ │ "" ║
; ║ │ If you have opted to copy all files, simply │ (if you opted to ║
; ║ │ assign "" to this variable. │ copy all files) ║
; ║ │ │ ║
; ║ WhichTbls │ Otherwise, list all of the tables needed for │ "{Items} ║
; ║ │ runtime version, each encased in curly brackets │ {Data\\Orders}" ║
; ║ │ and with no space between the brackets │ ║
; ║ │ │ (to copy tables ║
; ║ │ N. B. This must be enclosed in quotes. │ named Items and ║
; ║ │ │ Data\\Orders) ║
; ║ │ │ ║
; ╟─────────────┼────────────────────────────────────────────────────┼───────────────────╢
; ║ │ │ ║
; ║ │ │ "ProjMgmt" ║
; ║ │ The name of the directory to be created to │ ║
; ║ │ contain the system on the user's PC │ (To create a ║
; ║ TargetDir │ │ directory named ║
; ║ │ │ ProjMgmt for a ║
; ║ │ N. B. This must be enclosed in quotes. │ project manage- ║
; ║ │ │ ment system) ║
; ║ │ │ ║
; ╟─────────────┼────────────────────────────────────────────────────┼───────────────────╢
; ║ │ │ ║
; ║ │ │ "C:\\Pdox40" ║
; ║ │ The name (including full path) of the directory │ ║
; ║ │ containing your main Paradox system files │ (To signify ║
; ║ MainPdoxDir │ │ that your main ║
; ║ │ │ Paradox system ║
; ║ │ N. B. This must be enclosed in quotes. │ files are con- ║
; ║ │ │ tained in ║
; ║ │ │ directory ║
; ║ │ │ "C:\\Pdox40") ║
; ╟─────────────┼────────────────────────────────────────────────────┼───────────────────╢
; ║ │ │ ║
; ║ │ Name of directory containing your runtime files - │ ║
; ║ │ │ ║
; ║ │ (This is invoked as an argument to prevent having │ ║
; ║ │ to waste disk space by keeping a copies in each │ ║
; ║ │ applications' subdirectories.) │ "C:\\Pdox40 ║
; ║ │ │ \\Runtime" ║
; ║ │ This utility requires a runtime version of │ ║
; ║ │ Paradox that has been configured to match your │ ║
; ║ │ coding constraints - e. g., whether or not your │ ║
; ║ │ code is dependent upon setting blanks equal to │ (to signify ║
; ║ │ zero, maintained indices, formfeeds rather than │ that your ║
; ║ RuntimeDir │ linefeeds, a specific sort, color preferences, et │ Runtime.Zip ║
; ║ │ cetera. │ file is in ║ ║
; ║ │ │ your main ║ ║
; ║ │ If this has not already been done, please reread │ Paradox ║ ║
; ║ │ the "Important Notes" at the beginning of this │ directory's ║ ║
; ║ │ utility and follow the step-by-step instructions. │ subdirectory ║
; ║ │ (This will only have to be done once, since your │ named runtime) ║
; ║ │ customized runtime file can be used over and over │ ║
; ║ │ again to create runtime versions of all of your │ ║
; ║ │ applications.) │ ║
; ║ │ │ ║
; ║ │ N. B. This must be enclosed in quotes. │ ║
; ║ │ │ ║
; ╟─────────────┼────────────────────────────────────────────────────┼───────────────────╢
; ║ │ │ ║
; ║ │ The type of PC being used ("AT", "XT", "386", or │ ║
; ║ │ "Laptop") │ ║
; ║ │ │ ║
; ║ │ Unfortunately, many clones fail to specify class -│ "AT" ║
; ║ │ and most beginners have no idea what they are │ ║
; ║ PCType │ using. When in doubt, it is therefore prudent to │ ║
; ║ │ have applications default to "XT", since double │ (to specify ║
; ║ │ density diskettes can also be used by ATs. │ an AT) ║
; ║ │ │ ║
; ║ │ N. B. Unless this is a variable, it must be │ ║
; ║ │ enclosed in quotes. │ ║
; ║ │ │ ║
; ╟─────────────┼────────────────────────────────────────────────────┼───────────────────╢
; ║ │ │ ║
; ║ │ │ "A" ║
; ║ │ The floppy drive in which the diskette is to be │ ║
; ║ │ to copy the runtime system │ (To signify ║
; ║ │ │ Drive A) ║
; ║ WhereTo │ (Use "" to have the user prompted to designate │ ║
; ║ │ the drive.) │ "" ║
; ║ │ │ (To have the ║
; ║ │ N. B. Unless this is a variable, it must be │ user prompted ║
; ║ │ enclosed in quotes. │ to designate ║
; ║ │ │ the drive) ║
; ║ │ │ ║
; ╟─────────────┼────────────────────────────────────────────────────┼───────────────────╢
; ║ │ │ ║
; ║ │ When uploading files to bulletin boards or │ ║
; ║ │ CompuServe, it is awkward (if not impossible) to │ ║
; ║ │ incorporate separate installation batch files. │ ║
; ║ │ Accompanying instructional text files are │ "Yes" ║
; ║ │ equally impractical, since they can easily │ ║
; ║ │ become separated from the original. │ (if this ║
; ║ │ │ SingleExeFile ║
; ║ │ Although licensing restrictions preclude │ will be needed) ║
; ║ │ randomly circulating runtime versions, many │ ║
; ║ │ people have created shareware products clearly │ ║
; ║ │ stipulating the proper licensing arrangement. │ ║
; ║ │ Likewise, many companies transfer such files │ ║
; ║ │ back and forth via modem. │ ║
; ║SingleExeFile│ │ - or - ║
; ║ │ Accordingly, whenever a single file is │ ║
; ║ │ preferable (as when preparing a runtime version │ ║
; ║ │ to be sent via modem, the system will │ ║
; ║ │ automatically create a special executable file │ ║
; ║ │ combining the system and batch file into one │ "No" ║
; ║ │ file. Once the user has typed the name of the │ ║
; ║ │ exe file, it will explode into another │ (if this ║
; ║ │ installation file, an install.bat file, and a │ SingleExeFile ║
; ║ │ read.me file, proving very intuitive to the │ will not be ║
; ║ │ user. │ needed) ║
; ║ │ │ ║
; ║ │ Select "Yes" if this SingleExeFile will be │ ║
; ║ │ necessary, or "No" if it is not required. │ ║
; ║ │ │ ║
; ╚═════════════╧════════════════════════════════════════════════════╧═══════════════════╝
Proc Make_Runtime(SystemName, Acronym, UserPass, Driver, WhichFiles, WhichTbls,
TargetDir, MainPdoxDir, RuntimeDir, PCType, WhereTo, SingleExeFile)
Private FlName, RDADir, Tbl, Tmp
; --- Check to see if the user left a temporary runtime directory from a
; previous session (e. g., illegally aborted or changed options to
; save the files)
If DirExists("MakeRun") = 1
Then Cursor Off
Clear_Canvas()
Draw_Box("Wide", 63, 00, 00, 24, 79, "", "") ; White on cyan
Draw_Box("Wide", 15, 05, 07, 16, 73, "", "") ; White on black
Style Attribute 11 ; light cyan on black
@ 07,12 ?? "You already have a directory/file created during a"
@ 08,12 ?? "previous session, which you chose not to delete from"
@ 09,12 ?? "within the program (as is set up to occur automatically)."
@ 11,12 ?? "Please review the files in temporary directory MakeRun."
@ 13,12 ?? "When ready to run this system, delete those files and"
@ 14,12 ?? "remove the MakeRun directory."
Style attribute 03
@ 21,22 ?? " Press any key when ready to proceed. "
Dummy = Getchar()
Cursor Normal
Return
Endif
; Give the password necessary to copy the tables and scripts
If Isassigned(UserPass) and Not IsBlank(UserPass)
Then Password UserPass
EndIf
WhichDir = Directory()
SingleExeFile = Upper(SingleExeFile)
SetDir Directory() ; clear temporary Tables
; -- Create temporary directory to create runtime version
Run "MD MakeRun"
If Not IsAssigned(AutoLib) or IsBlank(AutoLib)
Then LibName = "TempRun"
CreateLib LibName
WriteLib LibName Create_InstallationFile Release Procs Create_InstallationFile
WriteLib LibName Which_Files Release Procs Which_Files
WriteLib LibName Make_Floppy Release Procs Make_Floppy
WriteLib LibName Make_Label Release Procs Make_Label
WriteLib LibName Copy_More Release Procs Copy_More
WriteLib LibName Single_ExeFile Release Procs Single_ExeFile
WriteLib LibName Clear_Canvas Release Procs Clear_Canvas
WriteLib LibName Draw_Box Release Procs Draw_Box
WriteLib LibName Cross_Line Release Procs Cross_Line
WriteLib LibName Please_Wait Release Procs Please_Wait
WriteLib LibName Backup_Data Release Procs Backup_Data
WriteLib LibName Check_TargetDrive Release Procs Check_TargetDrive
AutoLib = (Directory()) + "TempRun"
EndIf
; -- Copy customized version of Paradox's runtime files to this directory
Run "Copy " + RuntimeDir + "\\Runtime.Zip MakeRun\\Runtime.Zip"
; -- Unarchive runtime.zip (requires that utility PkZip is in path)
{Tools} {More} {Directory} Typein "MakeRun\\" Enter {OK}
Run "PkUnzip -d Runtime.Zip"
{Tools} {More} {Directory} Select WhichDir {OK}
; -- Create a file named backup.txt to ensure a complete user-friendly, menu-driven
; application by bypassing DOS questions when the diskette is being formatted.
If not IsFile("Backup.Txt")
Then Print File "Backup.Txt" "N", "\N"
Print File "Backup.Txt" "/26", "\N"
EndIf
; -- Delete original Runtime.Zip from temporary directory
Run "Del MakeRun\\Runtime.Zip: <Backup.Txt >Nul"
Run "Copy Backup.Txt MakeRun\\Backup.Txt"
; -- create Acronym batch file
Print File "MakeRun\\" + Acronym + ".Bat" "CD\\" + TargetDir, "\N"
Print File "MakeRun\\" + Acronym + ".Bat" "PdoxRun " + Driver, "\N"
Which_Files()
; -- If you have not already done so, for all scripts in subdirectory MakeRun, change
; every occurrence of Echo to TKEcho. (As explained at the beginning ot this
; article, since TKEcho will work in both runtime and interactive Paradox, most
; developers simply use TKEcho in all code to ensure that all applications are
; "version independent" and will work in either runtime or interactive Paradox.)
; -- Make the archived files a self-extracting archive file so that they can be
; unarchived by the user regardless of whether or not he owns PkZip.
; (requires that utility PkZip is in path)
Run "Zip2Exe " + SystemName
; -- Note variation below for handling files that exceed the size of your
; diskette.
; -- Delete now unnecessary zipped file
Run "Del " + SystemName + ".Zip"
; -- Create files needed to automatically install and invoke the system
; (If not using a single exe file, copy to diskettes and make
; appropriate labels.)
Switch
Case SingleExeFile = "NO" : Create_InstallationFile(SystemName)
Make_Floppy()
Copy_More()
Case SingleExeFile = "YES": Create_InstallationFile("ZipFiles")
Single_ExeFIle()
EndSwitch
; -- Delete the temporary directory. (Uncomment these lines should you
; prefer to keep the entire runtime system in a subdirectory.)
; -- If RDA is supported, delete the subdirectories
Array Tbl[100]
For X From 1 To 100
If Match(WhichTbls, "{..}..", ThisTbl, WhichTbls)
Then Tbl[X] = ThisTbl
If Match(ThisTbl, "..\\..", RDADir, Tmp)
Then If DirExists(RDADir) <> 1
Then Run "RD " + RDADir
EndIf
EndIf
Else QuitLoop
EndIf
EndFor
If SingleExeFile = "NO"
Then {Tools} {More} {Directory} Select WhichDir {OK}
Run "Del MakeRun\\*.Exe"
Run "Del MakeRun\\*.Bat"
"RD MakeRun"
EndIf
; Remove the password to keep the tables and scripts protected
If Isassigned(UserPass) and Not IsBlank(UserPass)
Then UnPassword UserPass
EndIf
EndProc
Proc Create_InstallationFile(ExeNum) ; ExeNum = the number of exe files required
Private L
; -- Create installation batch file
Array L[28]
L[1] = "@ Echo off"
L[2] = "CLS"
L[3] = "Echo."
L[4] = "Echo."
L[5] = "Echo."
L[6] = "Echo █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█"
L[7] = "Echo █ █"
L[8] = "Echo █ Please wait while your files are being set up. █"
L[9] = "Echo █ █"
L[10] = "Echo █ In the future, to run the program: █"
L[11] = "Echo █ █"
L[12] = "Echo █ (1) Go to the DOS prompt. █"
L[13] = "Echo █ █"
L[14] = "Echo █ (2) Type " + Acronym + " to run your application."
+ Spaces(16 - Len(Acronym)) + "█"
L[15] = "Echo █ █"
L[16] = "Echo ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
L[17] = "Echo."
L[18] = "Echo."
L[19] = "Echo."
L[20] = "MD " + MainPdoxDir + "\\X"
L[21] = "CD\\"
L[22] = "MD " + TargetDir
L[23] = "CD \\" + TargetDir
L[24] = WhereTo + ":" + ExeNum + " -D"
L[25] = "CLS"
L[26] = "CD\\"
L[27] = "Copy " + TargetDir + "\\" + Acronym + ".bat " + Acronym + ".Bat"
L[28] = Acronym
For N from 1 to ArraySize(L)
Print File "Install.Bat" L[N], "\N"
Endfor
EndProc
Proc Which_Files() ; If not copying all files, provide list of tables in directory
; if all, use XCopy. Otherwise,
; run as shown
WhichFiles = Upper(WhichFiles)
If WhichFiles <> "ALL"
Then ; -- Copy all necessary tables to temporary directory
; (Use Paradox rather than DOS copy for tables to include family objects)
; If RDA is supported, create the necessary directories
Array Tbl[100]
For X From 1 To 100
If Match(WhichTbls, "{..}..", ThisTbl, WhichTbls)
Then Tbl[X] = ThisTbl
If Match(ThisTbl, "..\\..", RDADir, Tmp)
Then If DirExists("MakeRun\\" + RDADir) <> 1
Then Run "MD " + "MakeRun\\" + RDADir
EndIf
Endif
Copy ThisTbl "MakeRun\\" + ThisTbl
If MenuChoice() = "Cancel"
Then Select "Replace"
EndIf
Else QuitLoop
EndIf
EndFor
; -- Copy all necessary files (other than tables) to temporary directory
Array FlName[100]
For X From 1 To 100
If Match(WhichFiles, "{..}..", ThisFile, WhichFiles)
Then FlName[X] = ThisFile
If Match(ThisFile, "..\\..", RDADir, Tmp)
Then If DirExists("MakeRun\\" + RDADir) <> 1
Then Run "MD MakeRun\\" + RDADir
EndIf
EndIf
Run "Copy " + ThisFile + " MakeRun\\" + ThisFile
Else QuitLoop
EndIf
EndFor
; -- Archive all files needed for runtime version (requires that utility PkZip is in
; path)
{Tools} {More} {Directory} Typein "MakeRun\\" Enter {OK}
Run "Pkzip -rpm " + SystemName
Else Run "Copy MakeRun\\*.*"
Run "Del MakeRun\\*.*"
Run "Pkzip -rp " + SystemName
Run "Ren " + SystemName + ".Zip MakeRun\\" + SystemName + ".Zip"
Run "Del PdoxRun.*"
Run "Del Custom.*"
Run "Del *.Cfg"
{Tools} {More} {Directory} Typein "MakeRun\\" Enter {OK}
EndIf
EndProc
Proc Make_Floppy()
If IsBlank(WhereTo)
Then Clear_Canvas()
Draw_Box("Wide", 63, 04, 04, 18, 76, "", "")
Style Attribute 03 @ 15,12 ?? " Press the <Enter> key when finished, or <Esc> to quit. "
Style Attribute 48 @ 07,23 ?? "Which drive will you place the diskette in?"
Style Attribute 63 @ 11,25 ?? "Please answer either A or B: "
Style attribute 11 Accept "A1" Required Picture "A,B" To WhereTo
EndIf
PcType = Upper(PCType)
Switch
Case PCType = "AT"
or PCType = "386" : Density = "high"
Switch
Case WhereTo = "A": Disksize = "5 1/4"
Case WhereTo = "B": Disksize = "3 1/2"
EndSwitch
Case PCType = "XT" : Disksize = "5 1/4"
Density = "double"
Case PCType = "LAPTOP" : Disksize = "3 1/2"
Density = "double"
Endswitch
Clear_Canvas()
Draw_Box("Wide", 63, 00, 03, 24, 76, "", "") ; White on cyan
@ 18,21 ?? "Does this diskette need to be formatted?"
Style attribute 48 ; Black on cyan
@ 7,10 ?? "You will need a formatted "+DiskSize+"-inch double-sided, "+Density+"-"
@ 8,10 ?? "density diskette (floppy disk)."
@ 10,10 ?? "Holding the diskette at the top (so that the manufacturer's"
@ 11,10 ?? "label is to the right, and the write-protect notch is to the"
@ 12,10 ?? "left), place it in your computer's floppy drive "+ Upper(WhereTo) +"."
@ 14,10 ?? "Pull down the lever at the top of the floppy drive. (If"
@ 15,10 ?? "there is no lever, make certain that the diskette is firmly"
@ 16,10 ?? "in place.)"
Draw_Box("Wide", 15, 02, 13, 04, 65, "", "") ; White on black
Style Attribute 11 ; light cyan on black
Header = "MAKING ALLOCATION DISKETTE"
@ 3,16 ?? Format("AC,CU,W48",Strval(Header))
Style attribute 03
@ 22,14 ?? "Press the <Enter> key when finished (or <Esc> to quit)."
Style Attribute 15 ; white on black
@ 20,26 ?? "Please answer Yes or No: " ; relates to the above question
Style Attribute 11 Accept "A3" Required picture "{YES,NO}" to YN
If retval = False ; Return if user pressed escape key
Then return
Else Check_TargetDrive()
If YN = "YES"
Then Please_Wait("Please wait while the diskette is being formatted.")
Run NoRefresh "Format " + WhereTo + ": <Backup.Txt >Nul"
Else Run "Del " + WhereTo + ":\\*.*: <Backup.Txt >Nul"
Endif
Please_Wait("Please wait until light goes out and you hear a beep")
; Copy designated files to diskette
Run Big NoRefresh "Copy " + SystemName + "*.Exe " + WhereTo + ":"
If IsFile("Install.Bat")
Then Run Big NoRefresh "Copy Install.Bat " + WhereTo + ":"
EndIf
Endif
Beep ; Beep to advise user that backup is finished
Make_Label()
EndProc
Proc Make_Label()
Cursor Off
Clear_Canvas()
Draw_Box("Wide", 63, 00, 00, 24, 79, "", "") ; White on cyan
Style attribute 48 ; Black on cyan
@ 03,03 ?? "Make a label to tell the user how to install and invoke the system - e. g.,"
Draw_Box("Wide", 15, 07, 15, 17, 64, "", "") ; White on black
Style Attribute 11 ; light cyan on black
@ 09,17 ?? Format("AC,CU,W43",(Strval(SystemName) + " SYSTEM"))
@ 11,21 ?? "To install the system, insert this"
@ 12,21 ?? "diskette in drive " + WhereTo + " and type " + WhereTo + ":Install."
@ 14,21 ?? "To invoke the system in the future,"
@ 15,21 ?? "type " + Acronym + " at any DOS prompt."
Style attribute 03
@ 21,22 ?? " Press any key when ready to proceed. "
Dummy = Getchar()
Cursor Normal
EndProc
Proc Copy_More()
While True
Clear_Canvas()
Draw_Box("Wide", 63, 06, 06, 19, 72, "", "") ; White on cyan
Style attribute 48 ; Black on cyan
@ 09,19 ?? "Do you want to copy the runtime files "
@ 10,19 ?? "to any other diskette(s) at this time?"
Style attribute 03
@ 16,12 ?? "Press the <Enter> key when finished (or <Esc> to quit)."
Style Attribute 15 ; white on black
@ 13,24 ?? "Please answer Yes or No: " ; relates to the above question
Style Attribute 11 Accept "A3" Required picture "{YES,NO}" to YN
If retval = False ; Return if user pressed escape key
Then return
Else If YN = "YES"
Then Make_Floppy()
Else QuitLoop
Endif
Please_Wait("Please wait until light goes out and you hear a beep")
Beep ; Beep to advise user that backup is finished
EndIf
EndWhile
EndProc
Proc Single_ExeFile()
Private WhichName
; -- Delete all unnecessary files
Run "Ren " + SystemName + ".Exe ZipFiles.Exe"
; -- Create readme file for user
Array L[23]
L[1] = "@ Echo off"
L[2] = "CLS"
L[3] = "Echo."
L[4] = "Echo."
L[5] = "Echo."
L[6] = "Echo."
L[7] = "Echo."
L[8] = "Echo █▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀█"
L[9] = "Echo █ █"
L[10] = "Echo █ Please type the word INSTALL to install the system. █"
L[11] = "Echo █ █"
L[12] = "Echo █ In the future, to run the program: █"
L[13] = "Echo █ █"
L[14] = "Echo █ (1) Go to the DOS prompt. █"
L[15] = "Echo █ █"
L[16] = "Echo █ (2) Type " + Acronym + " to run your application."
+ Spaces(16 - Len(Acronym)) + "█"
L[17] = "Echo █ █"
L[18] = "Echo ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
L[19] = "Echo."
L[20] = "Echo."
L[21] = "Echo."
L[22] = "Echo."
L[23] = "Echo."
For N from 1 to ArraySize(L)
Print File "Read.Bat" L[N], "\N"
Endfor
Run "PkZip -RPM " + SystemName
Run "Zip2Exe " + SystemName
Run "Del *.Bat"
Run "Del *.Zip"
; -- If you want to keep both versions - one for modem transfers and
; another for diskettes - simply uncomment the next two lines:
EndProc
; ───────────────────────────────────────────────────────────────────────────────────────
; The following generic utilities are separate procedures called by Make_Runtime (i. e.,
; they can be used by themselves in any application, and were described at length in past
; issues of "Instant Scripts").
; Although they can be dramatically simplified (and enhanced) in 4.0, they are used in
; this manner to ensure that the utility will work with either version of Paradox.
; ───────────────────────────────────────────────────────────────────────────────────────
Proc Clear_Canvas() ; set canvas to black background
Clear Clearall
Paintcanvas Attribute 00 00, 00, 24, 79 Style attribute 15 ; black
Endproc
Proc Draw_Box(LineType,BoxColor,StartRow,StartColumn,Endrow,EndColumn,FirstCross,NextCross)
Private FillNum, ; Number of horizontal characters to fill in
X ; A counter
Fillnum = (EndColumn - StartColumn -1)
Linetype = Upper(LineType)
Switch
Case LineType = "SINGLE": UpperLeft = "\218" UpperRight = "\191"
LeftCross = "\195" RightCross = "\180"
LowerLeft = "\192" LowerRight = "\217"
HorizontalTop = "\196" HorizontalBottom = "\196"
Vertical = "\179"
Case LineType = "DOUBLE": UpperLeft = "\201" UpperRight = "\187"
LeftCross = "\204" RightCross = "\185"
LowerLeft = "\200" LowerRight = "\188"
HorizontalTop = "\205" HorizontalBottom = "\205"
Vertical = "\186"
Case LineType = "WIDE": UpperLeft = "\219" UpperRight = "\219"
LeftCross = "\219" RightCross = "\219"
LowerLeft = "\219" LowerRight = "\219"
HorizontalTop = "\223" HorizontalBottom = "\220"
Vertical = "\219"
EndSwitch
PaintCanvas Attribute BoxColor StartRow, StartColumn, EndRow, EndColumn Style Attribute BoxColor
@ StartRow, StartColumn ?? UpperLeft, Fill(HorizontalTop,FillNum), UpperRight
For X From (StartRow + 1) to (EndRow - 1)
@ X,StartColumn ?? Vertical ; Vertical lines at the "starting" column
@ X,EndColumn ?? Vertical ; Vertical lines at the "ending" column
EndFor
If not isblank(FirstCross)
Then @ FirstCross, StartColumn ?? LeftCross, Fill(HorizontalTop,FillNum), RightCross
If not isblank(NextCross)
Then @ NextCross, StartColumn ?? LeftCross, Fill(HorizontalTop,FillNum), RightCross
Endif
Endif
@ EndRow, StartColumn ?? LowerLeft, Fill(HorizontalBottom,FillNum), LowerRight
Endproc
Proc Cross_Line(LineType,StartRow,StartColumn,EndColumn)
Private FillNum, ; Number of characters to fill in
X, ; A counter
DOUBLESINGLE ; Single line drawn across double-lined box
Fillnum = (EndColumn - StartColumn -1)
Switch
Case LineType = "SINGLE" : LeftCross = "\195" ; ├
HorizontalCross = "\196" ; ─
RightCross = "\180" ; ┤
Case LineType = "DOUBLE" : LeftCross = "\204" ; ╠
HorizontalCross = "\205" ; ═
RightCross = "\185" ; ╣
Case LineType = "WIDE" : LeftCross = "\219" ; █
HorizontalCross = "\223" ; ▀
RightCross = "\219" ; █
Case LineType = "DOUBLESINGLE" : LeftCross = "\218" ; ╟
HorizontalCross = "\196" ; ─
RightCross = "\191" ; ╢
EndSwitch
Endproc
Proc Please_Wait(WaitMssg)
Cursor Off ; Do not show cursor
Clear Clearall ; Clear screen and canvas
PaintCanvas Attribute 00 00, 00, 24, 79 ; Draw black background
PaintCanvas Attribute 112 10, 07, 14, 75 ; Draw grey shadow
PaintCanvas Attribute 48 09, 04, 13, 73 ; Draw cyan box
Style Attribute 176 ; Draw blinking black characters
@ 11,05 ?? " \07 \07 \07 " ; (Ascii code 7)
@ 11,66 ?? " \07 \07 \07 " ; (Ascii code 7)
Style Attribute 48 ; Show black lettering
@ 11,13 ?? Format("AC,CC,W52",Strval(Waitmssg)) ; Center message (capitalizing
Endproc ; first letter of each word)
Proc Backup_Data(SystemName,WhichFiles,WhichDir,PCType,WhereTo) ; back up data
Private Density, ; Density of diskette (determined by argument PCType)
Header, ; Heading (determined by argument SystemName)
YN ; Whether or not user wants diskette formatted
If IsBlank(WhereTo)
Then Clear_Canvas()
Draw_Box("Wide", 63, 04, 04, 18, 76, "", "")
Style Attribute 03 @ 15,12 ?? " Press the <Enter> key when finished, or <Esc> to quit. "
Style Attribute 48 @ 07,23 ?? "Which drive will you place the diskette in?"
Style Attribute 63 @ 11,25 ?? "Please answer either A or B: "
Style attribute 11 Accept "A1" Required Picture "A,B" To Whereto
EndIf
PcType = Upper(PCType)
Switch
Case PCType = "AT"
or PCType = "386" : Density = "high"
Switch
Case WhereTo = "A": Disksize = "5 1/4"
Case WhereTo = "B": Disksize = "3 1/2"
EndSwitch
Case PCType = "XT" : Disksize = "5 1/4"
Density = "double"
Case PCType = "LAPTOP" : Disksize = "3 1/2"
Density = "double"
Endswitch
Clear_Canvas()
Draw_Box("Wide", 63, 00, 03, 24, 76, "", "") ; White on cyan
@ 18,21 ?? "Does this diskette need to be formatted?"
Style attribute 48 ; Black on cyan
@ 7,10 ?? "You will need a formatted "+DiskSize+"-inch double-sided, "+Density+"-"
@ 8,10 ?? "density diskette (floppy disk)."
@ 10,10 ?? "Holding the diskette at the top (so that the manufacturer's"
@ 11,10 ?? "label is to the right, and the write-protect notch is to the"
@ 12,10 ?? "left), place it in your computer's floppy drive "+ Upper(WhereTo) +"."
@ 14,10 ?? "Pull down the lever at the top of the floppy drive. (If"
@ 15,10 ?? "there is no lever, make certain that the diskette is firmly"
@ 16,10 ?? "in place.)"
Draw_Box("Wide", 15, 02, 13, 04, 65, "", "") ; White on black
Style Attribute 11 ; light cyan on black
Header = "BACKING UP " + Upper(SystemName) + " SYSTEM"
@ 3,16 ?? Format("AC,CU,W48",Strval(Header))
Style attribute 03
@ 22,14 ?? "Press the <Enter> key when finished (or <Esc> to quit)."
Style Attribute 15 ; white on black
@ 20,26 ?? "Please answer Yes or No: " ; relates to the above question
Style Attribute 11 Accept "A3" Required picture "{YES,NO}" to YN
If retval = False ; Return if user pressed escape key
Then return
Else Check_TargetDrive()
If YN = "YES"
Then Please_Wait("Please wait while the diskette is being formatted.")
Run NoRefresh "Format " + WhereTo + ": <Backup.Txt >Nul"
Endif
Please_Wait("Please wait until light goes out and you hear a beep")
If not Match(WhichDir,"..\\") ; Missing trailing
then WhichDir = WhichDir + "\\" ; Backslash
Endif
If Upper(Whichfiles) = "ALL" ; Establish which
Then WhichFiles = "" ; files are copied
Endif
WhichFiles = WhichDir + WhichFiles + "*.db "
Run Big NoRefresh "Copy " + WhichFiles ; Copy designated
+ WhereTo + ":>Nul" ; files to diskette
Endif
Beep ; Beep to advise user that backup is finished
Endproc
Proc Check_TargetDrive() ;---Check whether or not the specified drive is ready
Private Keypressed
Cursor off Clear_Canvas()
If not Drivestatus(Whereto)
Then Draw_Box("Wide", 63, 03, 11, 21, 64, "", "") Style attribute 48
@ 11,15 ?? "Please make sure that the diskette is placed"
@ 12,15 ?? "in your computer's floppy drive " + Upper(Whereto) + ". Pull"
@ 13,15 ?? "down the lever at the top of the floppy"
@ 14,15 ?? "drive (or, if there is no lever, make"
@ 15,15 ?? "certain the diskette is firmly in place)."
Draw_Box("Wide", 15, 06, 20, 08, 56, "", "")
Style attribute 03
@ 18,26 ?? "Press any key when ready."
Style attribute 139 ; blinking text
@ 07,27 ?? "DRIVE " + Upper(Whereto) + " IS NOT READY !!!"
Keypressed = Getchar()
Endif
Endproc
Proc Allocate_Diskette(WhichDir,PCType,WhereTo) ; allocate files
Private Density, ; Density of diskette (determined by argument PCType)
Header, ; Heading (determined by argument SystemName)
YN ; Whether or not user wants diskette formatted
If IsBlank(WhereTo)
Then Clear_Canvas()
Draw_Box("Wide", 63, 04, 04, 18, 76, "", "")
Style Attribute 03 @ 15,12 ?? " Press the <Enter> key when finished, or <Esc> to quit. "
Style Attribute 48 @ 07,23 ?? "Which drive will you place the diskette in?"
Style Attribute 63 @ 11,25 ?? "Please answer either A or B: "
Style attribute 11 Accept "A1" Required Picture "A,B" To Whereto
EndIf
PcType = Upper(PCType)
Switch
Case PCType = "AT"
or PCType = "386" : Density = "high"
Switch
Case WhereTo = "A": Disksize = "5 1/4"
Case WhereTo = "B": Disksize = "3 1/2"
EndSwitch
Case PCType = "XT" : Disksize = "5 1/4"
Density = "double"
Case PCType = "LAPTOP" : Disksize = "3 1/2"
Density = "double"
Endswitch
Clear_Canvas()
Draw_Box("Wide", 63, 00, 03, 24, 76, "", "") ; White on cyan
@ 18,21 ?? "Does this diskette need to be formatted?"
Style attribute 48 ; Black on cyan
@ 7,10 ?? "You will need a formatted "+DiskSize+"-inch double-sided, "+Density+"-"
@ 8,10 ?? "density diskette (floppy disk)."
@ 10,10 ?? "Holding the diskette at the top (so that the manufacturer's"
@ 11,10 ?? "label is to the right, and the write-protect notch is to the"
@ 12,10 ?? "left), place it in your computer's floppy drive "+ Upper(WhereTo) +"."
@ 14,10 ?? "Pull down the lever at the top of the floppy drive. (If"
@ 15,10 ?? "there is no lever, make certain that the diskette is firmly"
@ 16,10 ?? "in place.)"
Draw_Box("Wide", 15, 02, 13, 04, 65, "", "") ; White on black
Style Attribute 11 ; light cyan on black
Header = "MAKING ALLOCATION DISKETTE"
@ 3,16 ?? Format("AC,CU,W48",Strval(Header))
Style attribute 03
@ 22,14 ?? "Press the <Enter> key when finished (or <Esc> to quit)."
Style Attribute 15 ; white on black
@ 20,26 ?? "Please answer Yes or No: " ; relates to the above question
Style Attribute 11 Accept "A3" Required picture "{YES,NO}" to YN
If retval = False ; Return if user pressed escape key
Then return
Else Check_TargetDrive()
If YN = "YES"
Then Please_Wait("Please wait while the diskette is being formatted.")
Run NoRefresh "Format " + WhereTo + ": <Backup.Txt >Nul"
Endif
Please_Wait("Please wait until light goes out and you hear a beep")
If not Match(WhichDir,"..\\") ; Missing trailing
then WhichDir = WhichDir + "\\" ; Backslash
Endif
; Copy designated files to diskette
Run Big NoRefresh "Copy MakeRun\\*.Exe " + WhereTo + ":>Nul"
Run Big NoRefresh "Copy MakeRun\\*.Bat " + WhereTo + ":>Nul"
Endif
Beep ; Beep to advise user that backup is finished
EndProc
; ╔══════════════════════════════════════════════════════════════════════════════════════╗
; ║ S A M P L E U S A G E ║
; ╟──────────────────────────────────────────────────────────────────────────────────────╢
; ║ ║
; ║ To create a runtime version meeting the following specifications: ║
; ║ ║
; ║ System named Budget ║
; ║ ║
; ║ To be invoked by typing ETS at the DOS prompt ║
; ║ ║
; ║ Accessing protected tables with password AGORA (all caps) ║
; ║ ║
; ║ Incorporating files (other than tables) named Backup.txt, Budget.sc, ║
; ║ ExpGuide.doc, ExpSubs.sc, Splash.sc, and Utility.sc from subdirectory P ║
; ║ ║
; ║ Using tables named BgtMnth, BgtUpdat, and Expense from subdirectory D and ║
; ║ tables Printer, Signon, and Store from subdirectory L ║
; ║ ║
; ║ Placing the application in a directory named Expenses on the user's hard drive ║
; ║ ║
; ║ Using a PC on which Paradox was installed in directory Pdox40 on drive C ║
; ║ ║
; ║ Using a file named Runtime.Zip (created as described at the beginning of this ║
; ║ article, and thus available to be automatically reused in each of your ║
; ║ applications) found in subdirectory Pdox40\Runtime on drive C ║
; ║ ║
; ║ Using a 386 computer ║
; ║ ║
; ║ Copying the runtime version to floppy drive A: ║
; ║ ║
; ║ Not creating a single executable file ║
; ║ ║
; ║ Simply invoke the following procedure call: ║
; ║ ║
; ║ Make_Runtime("Budget" ║
; ║ "ETS", ║
; ║ "AGORA", ║
; ║ "Budget" ║
; ║ "{P\\Backup.txt}{P\\Budget.sc}{P\\ExpGuide.doc} ║
; ║ {P\\Expsubs.sc}{P\\Splash.sc}{P\\Utility.sc}", ║
; ║ "{D\\BgtMnth}{D\\BgtUpdat}{D\\Expense}{L\\Printer}{L\\Signon} ║
; ║ {L\\Store}", ║
; ║ "Expenses", ║
; ║ "C:\\Pdox40", ║
; ║ "C:\\Pdox40\\Runtime", ║
; ║ "386", ║
; ║ "A") ║
; ║ "No") ║
; ║ ║
; ║ As a rule, this would be invoked from your system's main menu ... For example, ║
; ║ provide a menu option to create a runtime version, and invoke a procedure call ║
; ║ (such as the one above) whenever that is selected. ║
; ║ ║
; ╚══════════════════════════════════════════════════════════════════════════════════════╝
; ╔══════════════════════════════════════════════════════════════════════════════════════╗
; ║ V A R I A T I O N S ║
; ╟──────────────────────────────────────────────────────────────────────────────────────╢
; ║ ║
; ║ This utility was designed to fully automate the runtime procedure and delete all ║
; ║ unnecessary files. However, should you prefer to keep the runtime system in a ║
; ║ subdirectory, simply uncomment lines ZZZ and ZZZ: ║
; ║ ║
; ║ Run "Del MakeRun\\*.*" ║
; ║ Run "RD MakeRun" ║
; ║ ║
; ╟──────────────────────────────────────────────────────────────────────────────────────╢
; ║ ║
; ║ If you had a single executable file created but want to keep both versions - one ║
; ║ for modem transfers and another for diskettes - simply uncomment lines ║
; ║ ZZZ and ZZZ: ║
; ║ Run "Del Install.Bat" ║
; ║ Run "Del ZipFiles. Exe" ║
; ║ ║
; ╟──────────────────────────────────────────────────────────────────────────────────────╢
; ║ ║
; ║ Version 2.04C of PkZip enables one to copy zipped files that exceed the size of ║
; ║ a single diskette. ║
; ║ ║
; ║ If one individual file (e. g., a single table) within the zipped file exceeds ║
; ║ the size of a diskette, shareware programs are available to split a file in ║
; ║ two. They can then be joined back together with either another shareware ║
; ║ program, or a batch file containing the command DOS Copy /B File1+File2 File. ║
; ║ ║
; ║ ║
; ║ For example, "PC Magazine" provides two utilities ("Slice" and "Splice") to ║
; ║ transfer files that will not fit on a single diskette. Both are included in ║
; ║ their book (DOS 5 Techniques and Utilities), and available on their CompuServe ║
; ║ forum (ZiffNet). ║
; ║ ║
; ║ Slice breaks large files into pieces and copies it to the required number of ║
; ║ diskettes. The format is Slice Filename TargetDrive - e. g., to split a ║
; ║ file named MyFile.Zip to diskettes in drive A: ║
; ║ ║
; ║ Slice MyFile.Zip A: ║
; ║ │ │ │ ║
; ║ │ │ └─ Target drive containing diskette ║
; ║ │ └────────── Name and extension of file to be copied ║
; ║ └──────────────── Word Slice ║
; ║ ║
; ║ Splice reconstructs the divided files, using format SourceDrive:\Splice ║
; ║ SourceDrive: TargetDrive\TargetDirectory - e. g., to copy the above spliced ║
; ║ file from a diskette in Drive A to directory c:\MyDir: ║
; ║ ║
; ║ A:\Splice A: C:\MyDir ║
; ║ │ │ │ │ │ ║
; ║ │ │ │ │ └─ Target drive and directory to which to copy file ║
; ║ │ │ │ └────── Source drive (containing the diskette) ║
; ║ │ │ └─────────── Word Splice ║
; ║ │ └────────────── Backslash ║
; ║ └──────────────── Source drive (containing the diskette) ║
; ║ ║
; ╟──────────────────────────────────────────────────────────────────────────────────────╢
; ║ ║
; ║ For maximum efficiency, all Paradox procedures should be written to libraries. ║
; ║ This step has been omitted from this script solely to ensure that it can easily ║
; ║ be used and mastered by novices as well as experienced developers. However, ║
; ║ once you have become adept at using libraries, the standard techniques should ║
; ║ be employed to incorporate these procedures after they have been tested and ║
; ║ modified to meet your needs. ║
; ║ ║
; ║ When declaring the autolib, make certain to include the full path ... e. g., ║
; ║ Autolib = (Directory() + "\\ETS") for an autolib named ETS. (The path is ║
; ║ necessary to enable the utility to locate the libraries from both the original ║
; ║ directory and the temporary MakeRun subdirectory. ║
; ║ ║
; ╚══════════════════════════════════════════════════════════════════════════════════════╝